home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / nihcl-30.lha / nihcl-3.0 / ex / ex13-1.c < prev    next >
C/C++ Source or Header  |  1990-05-15  |  2KB  |  96 lines

  1. // ex13-1.c -- Class Vehicle with multiple links
  2.  
  3. // $Header: /afs/alw.nih.gov/unix/sun4_40c/usr/local/src/nihcl-3.0/share/ex/RCS/ex13-1.c,v 3.0 90/05/15 22:44:30 kgorlen Rel $
  4.  
  5. #include <iostream.h>
  6.  
  7. class Link;
  8.  
  9. class LinkedList {
  10.     Link* firstLink;    // pointer to first Link of list 
  11.     Link* lastLink;     // pointer to last Link of list 
  12. public:
  13.     LinkedList()        { firstLink = lastLink = 0; }
  14.     Link* add(Link& l);
  15.     virtual void printOn(ostream& strm =cout) const;
  16. };
  17.  
  18. class Link {
  19.     Link* next;
  20.     friend LinkedList;
  21. public:
  22.     Link()                  { next = 0; }
  23.     Link* nextLink() const  { return next; }
  24.     virtual void printOn(ostream& strm =cout) const =0;
  25. };
  26.  
  27. Link* LinkedList::add(Link& l)
  28. {
  29.     if (firstLink == 0) firstLink = lastLink = &l;
  30.     else {
  31.         lastLink->next = &l;
  32.         lastLink = &l;
  33.     }
  34.     return &l;
  35. }
  36.  
  37. void LinkedList::printOn(ostream& strm) const
  38. {
  39.     Link* l = firstLink;
  40.     while (l != 0) {
  41.         l->printOn(strm);  strm << ' ';
  42.         l = l->next;
  43.     }
  44.     cout << endl;
  45. }
  46.  
  47. //--------------------------------------------
  48.  
  49. class AllLink: public Link {
  50. protected:
  51.     AllLink() {};
  52.     virtual void printOn(ostream& strm =cout) const =0;
  53. };
  54.  
  55. class QLink: public Link {
  56. protected:
  57.     QLink() {};
  58.     virtual void printOn(ostream& strm =cout) const =0;
  59. };
  60.  
  61. class Vehicle: public AllLink, public QLink {
  62.     static unsigned vehicleID;
  63.     static LinkedList allVehicles;
  64.     unsigned id;
  65. public:
  66.     Vehicle() {
  67.         id = ++vehicleID;
  68.         allVehicles.add(*(AllLink*)this);
  69.     }
  70.     static void printAll(ostream& strm =cout) {
  71.         allVehicles.printOn(strm);
  72.     }
  73.     virtual void printOn(ostream& strm =cout) const;
  74. };
  75.  
  76. unsigned Vehicle::vehicleID = 0;
  77. LinkedList Vehicle::allVehicles;
  78.  
  79. void Vehicle::printOn(ostream& strm) const
  80. {
  81.     strm << id;
  82. }
  83.  
  84. LinkedList stopLightQ[2];
  85.  
  86. main()
  87. {
  88.     stopLightQ[0].add(*(QLink*)new Vehicle);
  89.     stopLightQ[1].add(*(QLink*)new Vehicle);
  90.     stopLightQ[0].add(*(QLink*)new Vehicle);
  91.     stopLightQ[1].add(*(QLink*)new Vehicle);
  92.     cout << "allVehicles: "; Vehicle::printAll();
  93.     cout << "stopLightQ[0]: "; stopLightQ[0].printOn();
  94.     cout << "stopLightQ[1]: "; stopLightQ[1].printOn();
  95. }
  96.